package com.it.collection_exception;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 目标：理解集合的并发修改异常问题，并解决
 */
public class Test1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("王麻子");
        list.add("小李子");
        list.add("李爱花");
        list.add("张全蛋");
        list.add("无误");
        list.add("迪丽");
        System.out.println(list); // [王麻子, 小李子, 李爱花, 张全蛋, 无误, 迪丽]

        // 需求：找出集合中全部带"李"的名字，并从集合中删除
        Iterator<String> it = list.iterator(); // 迭代器
        while (it.hasNext()) {
            String name = it.next();
            if (name.contains("李")) {
//                list.remove(name);  // 会出现并发修改异常错误
                it.remove(); // 删除迭代器当前遍历到的数据，每删除一个数据后，相当于也在底层做了i--
            }
        }


        // 使用for循环遍历集合并删除集合中带李字的名字
//        for (int i = 0; i < list.size(); i++) {
//            // 获取每个数据
//            String name = list.get(i);
//            if (name.contains("李")){
//                list.remove(name);
//                i--; // 不加这个会出现漏删问题
//            }
//        }

        // 倒序删除也可以解决漏删问题
//        for (int i = list.size()-1; i < list.size(); i--)



//      使用增强for循环遍历集合并删除数据，会出现并发问题，但却没有办法解决这个bug
//        for (String name : list) {
//            if (name.contains("李")) {
//                list.remove(name);
//            }
//        }


//        使用Lambda循环遍历集合并删除数据，会出现并发问题，但却没有办法解决这个bug
//        list.forEach(name->{
//            if (name.contains("李")){
//                list.remove(name);
//            }
//        });

        System.out.println(list);

    }
}
